package cn.kent.base.daemonThread;

/**
 * 创建守护线程
 *
 * 守护线程介绍：Java中有两种线程：守护线程和用户线程，在JVM启动时会调用main函数，main函数就是一条用户线程，同时还会启动很多守护线程，比如，垃圾回收线程。
 * 守护线程和用户线程区别：
 * - 当最后一个非守护线程结束时，JVM会正常退出，而不管当前是否有守护线程 —— 只要有一个用户线程还没结束，正常情况下JVM就不会退出。
 *
 * 可以通过程序主线程启动一个子线程，然后主线程执行结束，通过jps命令查看，jvm并没有退出
 * 但是如果这个子线程设置成守护线程，那么jvm就会在主线程结束后直接退出。
 *
 * 应用：
 * 在Tomcat的NIO实现NioEndpoint中会开启一组接受线程来接受用户的连接请求，以及一组处理线程负责具体处理用户请求，那么这些线程是用户线程还是守护线程呢？ -- 守护线程
 * 也就意味着当tomcat收到shutdown命令的时候，没有用户线程的情况下tomcat进程会立即消亡，不会等待处理线程处理完当前请求。
 */
public class DaemonThreadTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("守护线程启动");
            }
        });
        thread.setDaemon(true);
        thread.start();
    }
}
